<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020/12/8
 * Time: 18:29
 */
namespace app\common\widget\send;
use app\common\helper\appmsg_helper;
use app\common\helper\appmsg_send_helper;
use app\common\helper\setting_helper;
use app\common\helper\user_helper;
use app\common\model\Appmsg;
use app\common\model\AppmsgSend;
use app\common\model\SendQueue;
use app\common\model\SendTask;
use app\common\model\Setting;
use app\common\widget\weixin\material_widget;
use app\common\widget\weixin\weixin_widget;

/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020/12/8
 * Time: 18:00
 */
class send_sync_widget
{
    /**
     * 同步素材到微信公众平台，计划任务
     */
    public function sync_appmsg()
    {
        //echo '11';exit;
        $setting_info = _uri('setting', array('field'=>'send_queue_sync'));
        if (!$setting_info || $setting_info['value'] == 1) {
            return false;
        }

        // 加锁
        Setting::update(['value' => 1], ['id' => $setting_info['id']]);

        // 拼装条件，获取等待同步的图文
        $need_filter = array(
            'merge_id'          => 0,
            'media_id'          => '',
            'send_queue_id >'   => 0,
            'status'            => 1
        );
        //$need_filter = array('id'=>22);
        // 限制每次只取几条
        $limit_num = 4;
        $need_appmsg_send_list = getList('appmsg_send',$need_filter, ['id', 'asc'], 0, $limit_num);

        if (!$need_appmsg_send_list) {
            Setting::update(['value' => 0], ['id' => $setting_info['id']]);
            echo 'no more '.__FILE__.__LINE__;
            return;
        }

        // 循环同步图文素材
        foreach ($need_appmsg_send_list as $k=>$v) {
            // 同步素材到微信公众平台
            $res = $this->sync_single_appmsg($v);
        }

        // 解锁
        Setting::update(['value' => 0], ['id' => $setting_info['id']]);

        echo 'success';
    }

    /**
     * 同步素材到微信公众平台，计划任务
     */
    public function sync_single_appmsg($need_appmsg_send)
    {
        if (!$need_appmsg_send) {
            return false;
        }

        // 同步素材到微信公众平台
        $res = $this->do_sync($need_appmsg_send['id']);
        //dump($res, __LINE__);

        $send_queue_update = array();
        if ($res != 'ok') {
            $send_queue_update['progress'] = 15;
            $send_queue_update['reason'] = $res;

        } else {
            $send_queue_update['progress'] = 1;
        }

        // 同步后，更新队列中的记录，让send_queue队列处于待发状态
        if ($send_queue_update) {
            update_res_field('send_queue', $need_appmsg_send['send_queue_id'], $send_queue_update);

            // 同时更新图文有有链接的
            if ($send_queue_update['progress'] == 15) {
                AppmsgSend::update(['media_id'=>'fail_'.$send_queue_update['reason']], ['id' => (int)$need_appmsg_send['id']]);
            }
        }

        return true;
    }

    /**
     * 真正的同步上传
     * @param int $msg_id
     * @return mixed
     */
    public function do_sync($msg_id)
    {
        $appmenu_key = setting_helper::get_setting_info('appmenu_key');
        if (!$appmenu_key) {
            return '此处需要用到公众平台的appid与appsecret，请先去自定义菜单里做填入真实的appid与appsecret做菜单授权';
        }

        $id = $msg_id;
        if (!$id) {
            return '请选择要上传的素材';
        }

        $appmsg_info = _uri('appmsg_send', ['id' => $id]);
        if (!$appmsg_info || $appmsg_info['status'] != 1) {
            return '该素材不存在或已删除';
        }

        // 注意：纯链接没内容的图文不能同步，关联图文不能同步

        // 不管单图文还是多图文，通过此函数返回一个二维数组
        $appmsg_list = appmsg_send_helper::get_appmsg_list($id, 0);
        if (!$appmsg_list) {
            return '该素材不存在或已删除';
        }

        foreach ($appmsg_list as $k=>$v) {
            if ($v['content_type'] == 1) {
                return '不能同步纯链接形式的图文，如果是多图文要保证里面的每条图文都有内容';
            }
        }

        $appmsg_media_id = '';
        // 如果该素材已上传过，上传前先做删除操作
        if ($appmsg_list[0]['media_id']) {

            // 多图文如果新增item，走编辑接口，会报{"errcode":40114,"errmsg":""}，微信无相关说明
            // 多图文也没有删除某一个item的接口
            // 所以有下面这个判断，单图文走编辑接口；多图文如果图文条数不变也走编辑接口，其它都走删除重新上传
            /*
            if (count($appmsg_list) != 1 && $appmsg_list[0]['sync_msg_num'] != count($appmsg_list)) {
                $flag = _widget('weixin.material')->permanent_del_media($appmsg_list[0]['media_id']);
                //an_dump('删除情况', $flag);
                // 如果删除成功，需要把本地图文中的media_id去掉，以免下次再次删除
                if ($flag == 'ok') {
                    _model('appmsg')->update($appmsg_list[0]['id'], array('media_id'=>''));
                }

            } else {
                $appmsg_media_id = $appmsg_list[0]['media_id'];
            }*/
        }

        //dump(count($appmsg_list));
        //exit;
        $post_data = array();
        foreach ($appmsg_list as $k=>$v) {
            //an_dump($content);
            //exit;

            if ($k != 1) {
                //continue;
            }

            //dump($k);
            // 如果内容中有含有图片，需要上传内容中的图片，走素材内容中图片特有的上传的接口
            $res = (new material_widget())->upload_weixin_img($v['content'], $id);
            //an_dump($res);
            if ($res['info'] != 'ok') {
                return $res['info'];
            }
            $content = $res['content'];
//dump($k, __LINE__);continue;
            // 处理内容中的视频
            $content = (new material_widget())->fix_content_video($content, $id);
            // 处理图文的封面，如果已上传过，并且没有再次做更改，则用之前的，否则重新上传；注意此处专门加的1==2,废弃这个分枝
            if ($v['cover_media_id'] && $v['cover_is_change'] != 1 && 1 == 2) {
                $thumb_media_id = $v['cover_media_id'];

            } else {
                // 永久素材中的封面，需要用永上传media的接口
                //$cover_res = (new material_widget())->permanent_media_upload(array('type'=>'image', 'file_path'=>$v['cover']));
                // 临时图文的接口，只需用临时上传素材的接口即可（即基础支持中的多媒体上传接口）
                $cover_res = (new weixin_widget())->upload(array('type'=>'image', 'file_path'=>$v['cover']));

                //dump($cover_res, __FUNCTION__, __LINE__);
                if (!is_array($cover_res) || !isset($cover_res['media_id'])) {
                    return $cover_res.' '.__LINE__;
                }
                $thumb_media_id = $cover_res['media_id'];
                AppmsgSend::update(['cover_media_id' => $thumb_media_id, 'cover_is_change' => 0], ['id' => $v['id']]);
            }

            //an_dump($cover_res);

            // 拼装每条信息
            $per_info = array(
                'title'                 => $v['title'],
                'thumb_media_id'        => $thumb_media_id,
                'author'                => '',
                'digest'                => $v['intro'],
                'show_cover_pic'        => $v['show_cover'],
                'content'               => $content,
                'content_source_url'    => $v['source_url']
            );
            $post_data[] = $per_info;

            //dump($post_data);

            // ==============   编辑图文关键的地方   =================
            // 如果有图文的media_id，走编辑需单条单条的更改
            // ===================================================
            if ($appmsg_media_id) {
                /*
                //dump($per_info, $appmsg_media_id, $k);exit;
                $result = (new material_widget())->permanent_update_news($per_info, $appmsg_media_id, $k);
                //dump($per_info, $k, $result);
                if (!is_array($result)) {
                    return $result;
                }
                */
            }
        }

        $update_info = array();
        //dump('line'.__LINE__);exit;
        // ==============   上传图文关键的地方   =================
        // 上传新的永久图文
        if (!$appmsg_media_id) {
            //dump($post_data);
            $result = (new material_widget())->upload_news($post_data);

            if (!is_array($result)) {
                return $result.__LINE__;
            }

            if (!isset($result['media_id']) || !$result['media_id']) {
                return json_encode($result);
            }

            // 上传成功后，更新图文素材的id
            $update_info['media_id'] = $result['media_id'];
        }

        //an_dump($update_info);

        $update_info['sync_time'] = date('Y-m-d H:i:s');
        $update_info['sync_msg_num'] = count($appmsg_list);

        // 上传成功后，更新图文素材的id、最近同步时间、及同步时此图文的数量
        //_model('appmsg_send')->update($id, $update_info);
        update_res_field('appmsg_send', $id, $update_info);

        //return array('info'=>'ok', 'sync_time'=>$update_info['sync_time']);
        return 'ok';
    }

    /**
     * 真正的同步上传
     * @param int $msg_id
     * @return mixed
     */
    public function do_tmp_sync($msg_id, $appmsg_list)
    {
        $id = $msg_id;
        if (!$appmsg_list) {
            return '该素材不存在或已删除';
        }

        foreach ($appmsg_list as $k=>$v) {
            if ($v['content_type'] == 1) {
                return '不能同步纯链接形式的图文，如果是多图文要保证里面的每条图文都有内容';
            }
        }

        $appmsg_media_id = '';
        // 如果该素材已上传过，上传前先做删除操作
        if ($appmsg_list[0]['media_id']) {

            // 多图文如果新增item，走编辑接口，会报{"errcode":40114,"errmsg":""}，微信无相关说明
            // 多图文也没有删除某一个item的接口
            // 所以有下面这个判断，单图文走编辑接口；多图文如果图文条数不变也走编辑接口，其它都走删除重新上传
            /*
             if (count($appmsg_list) != 1 && $appmsg_list[0]['sync_msg_num'] != count($appmsg_list)) {
             $flag = _widget('weixin.material')->permanent_del_media($appmsg_list[0]['media_id']);
             //an_dump('删除情况', $flag);
             // 如果删除成功，需要把本地图文中的media_id去掉，以免下次再次删除
             if ($flag == 'ok') {
             _model('appmsg')->update($appmsg_list[0]['id'], array('media_id'=>''));
             }

             } else {
             $appmsg_media_id = $appmsg_list[0]['media_id'];
             }*/
        }

        //exit;
        $post_data = array();
        foreach ($appmsg_list as $k=>$v) {
            //dump($content);
            //exit;

            if ($k != 1) {
                //continue;
            }

            // 如果内容中有含有图片，需要上传内容中的图片，走素材内容中图片特有的上传的接口
            $res = (new material_widget())->upload_weixin_img($v['content'], $id);
            //an_dump($res);
            if ($res['info'] != 'ok') {
                return $res['info'];
            }
            $content = $res['content'];

            // 处理内容中的视频
            $content = (new material_widget())->fix_content_video($content, $id);

            // 处理图文的封面，如果已上传过，并且没有再次做更改，则用之前的，否则重新上传；注意此处专门加的1==2,废弃这个分枝
            if ($v['cover_media_id'] && $v['cover_is_change'] != 1 && 1 == 2) {
                $thumb_media_id = $v['cover_media_id'];

            } else {
                // 永久素材中的封面，需要用永上传media的接口
                //$cover_res = _widget('weixin.material')->permanent_media_upload(array('type'=>'image', 'file_path'=>$v['cover']));
                // 临时图文的接口，只需用临时上传素材的接口即可（即基础支持中的多媒体上传接口）
                $cover_res = (new weixin_widget())->upload(array('type'=>'image', 'file_path'=>$v['cover']));
                if (!is_array($cover_res) || !isset($cover_res['media_id'])) {
                    return $cover_res.' '.__LINE__;
                }
                $thumb_media_id = $cover_res['media_id'];
                Appmsg::update(['cover_media_id'=>$thumb_media_id, 'cover_is_change'=>0], ['id' => $v['id']]);
            }

            //an_dump($cover_res);

            // 拼装每条信息
            $per_info = array(
                'title'                 => $v['title'],
                'thumb_media_id'        => $thumb_media_id,
                'author'                => '',
                'digest'                => $v['intro'],
                'show_cover_pic'        => $v['show_cover'],
                'content'               => $content,
                'content_source_url'    => $v['source_url']
            );
            $post_data[] = $per_info;

            // ==============   编辑图文关键的地方   =================
            // 如果有图文的media_id，走编辑需单条单条的更改
            // ===================================================
            if ($appmsg_media_id) {
                /*
                //dump($per_info, $appmsg_media_id, $k);exit;
               $result = (new material_widget())->permanent_update_news($per_info, $appmsg_media_id, $k);
               //dump($per_info, $k, $result);
               if (!is_array($result)) {
               return $result;
               }
               */
            }
        }

        $update_info = array();

        // ==============   上传图文关键的地方   =================
        // 上传新的永久图文
        if (!$appmsg_media_id) {
            //dump($post_data);
            $result = (new material_widget())->upload_news($post_data);

            if (!is_array($result)) {
                return $result.__LINE__;
            }

            if (!isset($result['media_id']) || !$result['media_id']) {
                return json_encode($result);
            }

            // 上传成功后，更新图文素材的id
            $update_info['media_id'] = $result['media_id'];
        }

        $update_info['sync_time'] = date('Y-m-d H:i:s');
        $update_info['sync_msg_num'] = count($appmsg_list);

        // 上传成功后，更新图文素材的id、最近同步时间、及同步时此图文的数量
        update_res_field('appmsg', $id, $update_info);

        //return array('info'=>'ok', 'sync_time'=>$update_info['sync_time']);
        return 'ok';
    }
}